#define evtchn_upcall_pending /* 0 */
#define evtchn_upcall_mask 1
+#define XEN_GET_VCPU_INFO(reg) movl HYPERVISOR_shared_info,reg
#define XEN_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg)
#define XEN_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg)
+#define XEN_SAVE_UPCALL_MASK(reg,tmp,off) \
+ movb evtchn_upcall_mask(reg), tmp; \
+ movb tmp, off(%esp)
+
#define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg)
#ifdef CONFIG_PREEMPT
#define SAVE_ALL \
SAVE_ALL_NO_EVENTMASK; \
- movl HYPERVISOR_shared_info, %esi; \
- movb evtchn_upcall_mask(%esi), %dl; \
- movb %dl, EVENT_MASK(%esp)
+ XEN_GET_VCPU_INFO(%esi); \
+ XEN_SAVE_UPCALL_MASK(%esi,%dl,EVENT_MASK)
#define RESTORE_INT_REGS \
popl %ebx; \
call schedule_tail
GET_THREAD_INFO(%ebp)
popl %eax
- movl HYPERVISOR_shared_info, %esi
+ XEN_GET_VCPU_INFO(%esi)
jmp syscall_exit
/*
testl $(VM_MASK | 2), %eax
jz resume_kernel # returning to kernel or vm86-space
ENTRY(resume_userspace)
- movl HYPERVISOR_shared_info, %esi
+ XEN_GET_VCPU_INFO(%esi)
XEN_BLOCK_EVENTS(%esi) # make sure we don't miss an interrupt
# setting need_resched or sigpending
# between sampling and the iret
#ifdef CONFIG_PREEMPT
ENTRY(resume_kernel)
- movl HYPERVISOR_shared_info, %esi
+ XEN_GET_VCPU_INFO(%esi)
cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
jnz restore_all
need_resched:
movl $(__USER_DS), %edx
movl %edx, %ds
movl %edx, %es
- movl HYPERVISOR_shared_info, %esi
- movb evtchn_upcall_mask(%esi), %dl
- movb %dl, EVENT_MASK+8(%esp)
+ XEN_GET_VCPU_INFO(%esi)
+ XEN_SAVE_UPCALL_MASK(%esi,%dl,EVENT_MASK+8)
call *%edi
addl $8, %esp
jmp ret_from_exception
jb 11f
cmpl $ecrit,%eax
jb critical_region_fixup
-11: movl HYPERVISOR_shared_info, %esi
+11: XEN_GET_VCPU_INFO(%esi)
movb $0, EVENT_MASK(%esp)
push %esp
call evtchn_do_upcall
jmp 11b
critical_fixup_table:
- .byte 0x00,0x00,0x00 # testb $0xff,(%esi)
+ .byte 0x00,0x00,0x00 # testb $0xff,(%esi) = XEN_TEST_PENDING
.byte 0x00,0x00 # jnz 14f
.byte 0x00 # pop %ebx
.byte 0x04 # pop %ecx
decl %eax /* eax = -1 */
pushl %ecx
pushl %ebx
- GET_THREAD_INFO(%ebp)
cld
movl %es,%ecx
movl ORIG_EAX(%esp), %esi /* get the error code */
movl $(__KERNEL_DS),%edx
movl %edx,%ds
movl %edx,%es
- movl HYPERVISOR_shared_info, %esi
- movb evtchn_upcall_mask(%esi), %dl
- movb %dl, EVENT_MASK+12(%esp)
+ XEN_GET_VCPU_INFO(%esi)
+ XEN_SAVE_UPCALL_MASK(%esi,%dl,EVENT_MASK+12)
call do_page_fault
addl $12,%esp
jmp ret_from_exception